package ar.edu.unrn.lia.bean;

import java.io.Serializable;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.persistence.OptimisticLockException;

import org.primefaces.event.SelectEvent;

import ar.edu.unrn.lia.bean.datamodel.LazyCuentaDataModel;
import ar.edu.unrn.lia.model.Cliente;
import ar.edu.unrn.lia.model.Cuenta;
import ar.edu.unrn.lia.service.ClienteService;
import ar.edu.unrn.lia.service.CuentaService;
import ar.edu.unrn.lia.service.exception.BusinessException;

@ManagedBean(name = "cuentaBean")
@ViewScoped
public class CuentaBean extends GenericBean<Cuenta> implements Serializable {

	private static final long serialVersionUID = 1L;

	@ManagedProperty(value = "#{cuentaService}")
	CuentaService entityService;
	@ManagedProperty(value = "#{clienteService}")
	ClienteService clienteService;
	
	private String caja;
	
	private String renta;
	
	

	public String getRenta() {
		return renta;
	}

	public void setRenta(String renta) {
		this.renta = renta;
	}

	public String getCaja() {
		return caja;
	}

	public void setCaja(String caja) {
		this.caja = caja;
	}

	public void setearNombreCuenta() {
		getEntity().setNombre(
				this.getEntity().getCliente().getApellido() + " "
						+ this.getEntity().getCliente().getNombre()
						+ " - CUENTA");
	}

	public List<Cliente> clientes(String query) {
		return clienteService.findByQuerySinCuenta(query, "apellido", "desc");
	}

	public String create() {
		setEntity(new Cuenta());
		return REDIRECT_CREATE;
	}

	public void onRowSelect(SelectEvent event) {
		agregarMensaje(FacesMessage.SEVERITY_INFO, "Cuenta Seleccionado:",
				((Cuenta) event.getObject()).getNombre());
	}

	public String update() {
		try {
			if (getEntity().getId() != null) {
				entityService.update(getEntity());
				mensajeFlash("Modificar Cuenta",
						"Operación realizada con exito.");
			}
			return REDIRECT_SEARCH;
		} catch (OptimisticLockException e) {
			agregarMensaje(FacesMessage.SEVERITY_ERROR, "Bloqueo",
					"Alquien modifico esta Cuenta, reconsulte.");
			return null;
		} catch (Exception e) {
			agregarMensaje(FacesMessage.SEVERITY_ERROR, "Error", e.getMessage());
			return null;
		}
	}

		
	@PostConstruct
	public void init()
	{
		setModelLazy(new LazyCuentaDataModel(entityService));
	}

	public void inicio() {
		if (!FacesContext.getCurrentInstance().isPostback()) {
			if (getId() != null) {
				setEntity(entityService.getEntityById(getId()));
			} else {
				setEntity(new Cuenta());
			}
			if (getCaja() != null) {
				try {
					setEntity(entityService.obtenerCuentaCaja());
				} catch (BusinessException e) {
					agregarMensaje(FacesMessage.SEVERITY_ERROR, "Cuenta Caja", "Error al recuperar Ceunta Caja, Consultar con Administrador.");
				}
			} else	if (getRenta() != null) {
				try {
					setEntity(entityService.obtenerCuentaRentas());
				} catch (BusinessException e) {
					agregarMensaje(FacesMessage.SEVERITY_ERROR, "Cuenta Renta", "Error al recuperar Cuenta Renta, Consultar con Administrador.");
				}
			} 
		}
	}

	public CuentaService getEntityService() {
		return entityService;
	}

	public void setEntityService(CuentaService entityService) {
		this.entityService = entityService;
	}

	public ClienteService getClienteService() {
		return clienteService;
	}

	public void setClienteService(ClienteService clienteService) {
		this.clienteService = clienteService;
	}

	public List<Cuenta> getCiudades() {
		return entityService.getAll();
	}

}
